package br.com.peperoncino.model;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import br.com.peperoncino.entity.ItemCardapio;
import br.com.peperoncino.utils.CalculoHelper;
import br.com.peperoncino.utils.HibernateUtil;
import br.com.peperoncino.utils.StringHelper;

public class ItemCardapioDAO {
	
	
	public Integer recuperaTotal(ItemCardapio dadosFiltro) {

		Session session = HibernateUtil.getSessionFactory().openSession();
		Integer quantidade = null;
		
		StringBuilder sb = montaQueryPadrao(dadosFiltro);
		
		
		sb.insert(0, "select count(*) ");
		
		try {
			
			session.getTransaction().begin();
			
			Query q = session.createQuery(sb.toString());
			
			montaFiltroQueryPadrao(q, dadosFiltro);
			
			quantidade = ((Long) q.uniqueResult()).intValue();
			
			return quantidade;
		
		} catch (Exception e) {
			 session.getTransaction().rollback();
			 System.out.println(e.toString());
		} finally{
			session.close();
		}
		
		return 0;
	}
	
	
	
	@SuppressWarnings("unchecked")
	public List<ItemCardapio> pesquisar(ItemCardapio dadosFiltro, Integer inicio, Integer quantidade) {

		Session session = HibernateUtil.getSessionFactory().openSession();
		List<ItemCardapio> cardapios = null;
		
		StringBuilder sb = montaQueryPadrao(dadosFiltro);
		try {
			
			session.getTransaction().begin();
			
			Query q = session.createQuery(sb.toString());
			
			montaFiltroQueryPadrao(q, dadosFiltro);
			
	        q.setFirstResult(inicio);  
	        q.setMaxResults(quantidade);  
			
			cardapios = (List<ItemCardapio>) q.list();
		
		} catch (Exception e) {
			 session.getTransaction().rollback();
			 System.out.println(e.toString());
		} finally{
			session.close();
		}
		
		return cardapios;
	}
	
	private void montaFiltroQueryPadrao(Query q, ItemCardapio dadosFiltro) {
		
		if(dadosFiltro!= null){
			if(!StringHelper.ehBrancoOuNulo(dadosFiltro.getNome())){
				q.setParameter("nome", "%" + dadosFiltro.getNome() + "%");
			}
			
			if(dadosFiltro.getTipoItem() != null){
				q.setParameter("tipoItem", dadosFiltro.getTipoItem());
			}
			
			if(!CalculoHelper.ehZeroOuNulo(dadosFiltro.getValor())){
				q.setParameter("valor", dadosFiltro.getValor());
			}
		}
		
	}



	private StringBuilder montaQueryPadrao(ItemCardapio dadosFiltro) {
		
		StringBuilder sb = new StringBuilder();
		sb.append("from ItemCardapio as item ");
		
		if(dadosFiltro!= null){
			
			StringBuilder where = new StringBuilder("where ");
			
			if(!StringHelper.ehBrancoOuNulo(dadosFiltro.getNome())){
				where.append(" upper(item.nome) like upper(:nome) and");
			}
			
			if(dadosFiltro.getTipoItem() != null){
				where.append(" item.tipoItem = :tipoItem and");
			}
			
			if(!CalculoHelper.ehZeroOuNulo(dadosFiltro.getValor())){
				where.append(" item.valor = :valor and");
			}
			
			if(where.length() > 6){
				where.delete(where.length()-3, where.length());
				
				sb.append(where);
			}
		}
		
		return sb;
		
	}



	public void salvarItemCardapio(ItemCardapio itemCardapio){
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		
		try {
			
			session.getTransaction().begin();
			
			if(itemCardapio.getId() == null){
				session.persist(itemCardapio);
			}else{
				session.merge(itemCardapio);
			}
			
			session.getTransaction().commit();
			
		} catch (Exception e) {
			 session.getTransaction().rollback();
			 System.out.println(e.toString());
		} finally{
			session.close();
		}
	}

	public void deleteItemCardapio(ItemCardapio itemCardapio) {

	Session session = HibernateUtil.getSessionFactory().openSession();
		
		try {
			
			session.getTransaction().begin();
			
			session.delete(itemCardapio);
			
			session.getTransaction().commit();
			
		} catch (Exception e) {
			 session.getTransaction().rollback();
			 System.out.println(e.toString());
		} finally{
			session.close();
		}
		
	}
	
}
